public class Main {
    static int i = 0;

    public static void main(String[] args) {
        System.out.println(ack(3, 2));
        System.out.println(i);
    }


    /**
     * 使用数学的方法解释：
     * 讨论出口：ack(1,0) ack(2,0)  通过计算可得 ack(1,0)=2 ;ack(2,0)=3
     * 讨论ack(1,n)  可得ack(1,n)=ack(0,ack(1,n-1))=ack(1,n-1)+1=...ack(1,0)+n 即ack(1,n)=n+2
     * 讨论ack(2,n)  ack(2,n)=ack(1,ack(2,n-1))=ack(2,n-1)+2=...ack(2,0)=2n  即ack(1,n)=2n+3
     * 最终推出 ack(3,n)= 2的n+3次幂 -3  代入2 n=2 2*2*2*2*2-3=29
     *
     * @param m
     * @param n
     * @return
     */
    static int ack(int m, int n) {
        i++;
        if (m == 0)
            return n + 1;
        else if (n == 0)
            return ack(m - 1, 1);
        else
            return ack(m - 1, ack(m, n - 1));
    }
}